import Jama.Matrix;

/**
 * 矩阵运算类型转换实用类
 */
public class TypeChange {
    /**
     * 用于在线性回归计算中判断用户输入的矩阵是否合法
     *
     * @param a 用户输入的矩阵
     * @return 错误信息
     */
    public static String isLinearlegal(String a) {
        StringBuilder reString = new StringBuilder();
        int lenth = a.length();
        int column = 1, row = 1;
        int count = 1;
        int allcount = 0;
        for (int i = 0; i < lenth; i++) {
            if (row == 3) {
                reString.append("矩阵不能存在第三行数据，请按照正确格式输入\n");
                return reString.toString();
            }
            if (a.charAt(i) == '\n') {
                if (count == 1) {
                    reString.append("请保证点的个数大于1\n");
                    return reString.toString();
                }
                if (row == 1) {
                    allcount = count;
                } else {
                    if (count != allcount) {
                        reString.append("请保证矩阵每一行的元素个数相同\n");
                    }
                }
                row++;
                column = 1;
                count = 1;
                continue;
            } else if (a.charAt(i) == '.') {
                if (a.charAt(i - 1) < '0' || a.charAt(i - 1) > '9' || a.charAt(i + 1) < '0' || a.charAt(i + 1) > '9') {
                    reString.append("第").append(row).append("行").append(",第").append(column).
                            append("列").append("(第").append(count).append("个数)有字符不合法\n");
                }
            } else if (a.charAt(i) == ' ') {
                if (column == 1) {
                    reString.append("第").append(row).append("行开头存在空格,请删去\n");
                    return reString.toString();
                }
                count++;
                if (a.charAt(i - 1) == ' ') {
                    reString.append("第").append(row).append("行").append(",第").append(column).
                            append("列").append("(第").append(count).append("个数)处存在多个空格字符\n");
                }
            } else {
                if (a.charAt(i) != '-') {
                    if (!(a.charAt(i) >= '0' && a.charAt(i) <= '9')) {
                        reString.append("第").append(row).append("行").append(",第").append(column).
                                append("列").append("(第").append(count).append("个数)有字符不合法\n");
                    }
                }
            }
            column++;
        }
        return reString.toString();
    }

    /**
     * 一般的矩阵计算中，判断用户输入的矩阵是否合法
     *
     * @param a 用户输入的矩阵
     * @return 错误信息
     */
    public static String islegal(String a) {
        StringBuilder reString = new StringBuilder();
        int lenth = a.length();
        int column = 1, row = 1;
        int count = 1;
        int allcount = 0;
        for (int i = 0; i < lenth; i++) {
            if (a.charAt(i) == '\n') {

                if (row == 1) {
                    allcount = count;
                } else {
                    if (count != allcount) {
                        reString.append("请保证矩阵每一行的元素个数相同\n");
                    }
                }
                row++;
                column = 1;
                count = 1;
                continue;
            } else if (a.charAt(i) == '.') {
                if (a.charAt(i - 1) < '0' || a.charAt(i - 1) > '9' || a.charAt(i + 1) < '0' || a.charAt(i + 1) > '9') {
                    reString.append("第").append(row).append("行").append(",第").append(column).
                            append("列").append("(第").append(count).append("个数)有字符不合法\n");
                }
            } else if (a.charAt(i) == ' ') {
                if (column == 1) {
                    reString.append("第").append(row).append("行开头存在空格,请删去\n");
                    return reString.toString();
                }
                count++;
                if (a.charAt(i - 1) == ' ') {
                    reString.append("第").append(row).append("行").append(",第").append(column).
                            append("列").append("(第").append(count).append("个数)处存在多个空格字符\n");
                }
            } else {
                if (a.charAt(i) != '-') {
                    if (!(a.charAt(i) >= '0' && a.charAt(i) <= '9')) {
                        reString.append("第").append(row).append("行").append(",第").
                                append(column).append("列").append("(第").append(count).append("个数)有字符不合法\n");
                    }
                }
            }
            column++;
        }
        return reString.toString();
    }

    /**
     * String转矩阵，将用户输入的文本信息处理为Matrix类的实例
     *
     * @param a 用户输入的矩阵文本
     * @return 矩阵
     */
    public static Matrix TtoD(String a) {
        int row = 0, column = 0;
        int maxrow, maxcolumn;

        String[] t = a.split("\n");
        maxrow = t.length;

        String[] temp;
        temp = t[0].split(" ");
        maxcolumn = temp.length;

        double[][] matrix = new double[maxrow][maxcolumn];
        for (String b : t) {
            temp = b.split(" ");
            for (String number : temp) {
                matrix[row][column++] = Double.parseDouble(number);
            }
            column = 0;
            row++;
        }
        //		A.print(1, 4);
        return new Matrix(matrix);
    }

    /**
     * 矩阵转文本信息，输出矩阵时使用
     *
     * @param m 需要转文本的矩阵
     * @return String格式的矩阵
     */
    public static String MtoS(Matrix m) {
        int lenth = ZNBCalculator.n;
        int row = m.getRowDimension();
        int column = m.getColumnDimension();
        double[][] a = m.getArray();
        StringBuilder Matrix = new StringBuilder();
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < column; j++) {
                switch (lenth) {
                    case 1 -> Matrix.append(String.format("%.1f", a[i][j])).append(" ");
                    case 2 -> Matrix.append(String.format("%.2f", a[i][j])).append(" ");
                    case 3 -> Matrix.append(String.format("%.3f", a[i][j])).append(" ");
                    case 4 -> Matrix.append(String.format("%.4f", a[i][j])).append(" ");
                    case 5 -> Matrix.append(String.format("%.5f", a[i][j])).append(" ");
                    case 0 -> Matrix.append(String.format("%.0f", a[i][j])).append(" ");
                }
            }
            Matrix.append("\n");
        }
        return Matrix.toString();
    }

    /**
     * 将Double保留一定的小数位数并转化为文本
     *
     * @param d 输入的浮点型数字
     */
    public static String doubleToString(double d) {
        int lenth = ZNBCalculator.n;
        return switch (lenth) {
            case 0 -> String.format("%.0f", d);
            case 1 -> String.format("%.1f", d);
            case 2 -> String.format("%.2f", d);
            case 3 -> String.format("%.3f", d);
            case 4 -> String.format("%.4f", d);
            case 5 -> String.format("%.5f", d);
            default -> null;
        };
    }

    /**
     * 从矩阵中取出特征值并添加文字信息转为可供显示的String
     * Matrix类中处理得到的特征值矩阵中，特征值在对角线上
     *
     * @param m 特征值矩阵
     */
    public static String getdiagonal(Matrix m) {
        StringBuilder temp = new StringBuilder();
        int lenth = ZNBCalculator.n;
        int count = m.getColumnDimension();
        for (int i = 0; i < count; i++) {
            switch (lenth) {
                case 1 -> temp.append("特征值").append(i + 1).append(":").
                        append(String.format("%.1f", m.get(i, i))).append("\n");
                case 2 -> temp.append("特征值").append(i + 1).append(":").
                        append(String.format("%.2f", m.get(i, i))).append("\n");
                case 3 -> temp.append("特征值").append(i + 1).append(":").
                        append(String.format("%.3f", m.get(i, i))).append("\n");
                case 4 -> temp.append("特征值").append(i + 1).append(":").
                        append(String.format("%.4f", m.get(i, i))).append("\n");
                case 5 -> temp.append("特征值").append(i + 1).append(":").
                        append(String.format("%.4f", m.get(i, i))).append("\n");
                case 0 -> temp.append("特征值").append(i + 1).append(":").
                        append(String.format("%.5f", m.get(i, i))).append("\n");
            }
        }
        return temp.toString();
    }

    /**
     * 将特征向量矩阵 添加提示信息后作为String返回
     *
     * @param m 特征向量矩阵
     */
    public static String gettz(Matrix m) {
        StringBuilder temp = new StringBuilder();
        int len = m.getColumnDimension();
        for (int i = 1; i <= len; i++) {
            temp.append("向量").append(i).append(" ");
        }
        temp.append("\n");
        temp.append(MtoS(m));
        return temp.toString();
    }
}
